﻿from PIL import Image, ImageDraw, ImageFont

def create_text_watermark(text="Watermark", 
                         font_size=40, 
                         opacity=0.5, 
                         font_path=None,
                         output_path="watermark.png"):
    """
    生成500x500黑底白字的文字水印，文字位置固定在(10,10)
    
    参数:
    text: 水印文字内容
    font_size: 字体大小
    opacity: 透明度 (0~1，仅影响文字)
    font_path: 自定义字体路径（None为系统默认字体）
    output_path: 输出图片路径
    """
    # 校验透明度
    opacity = max(0, min(1, opacity))
    
    # 加载字体
    try:
        if font_path:
            font = ImageFont.truetype(font_path, font_size)
        else:
            font = ImageFont.load_default().font_variant(size=font_size)
    except Exception as e:
        raise ValueError(f"字体加载失败: {e}")

    # 创建黑底画布
    image_size = (500, 500)
    image = Image.new("RGB", image_size, (0, 0, 0))  # 黑底（RGB模式，无透明通道）
    draw = ImageDraw.Draw(image)
    
    # 计算文本实际边界框
    bbox = draw.textbbox((0, 0), text, font=font)
    text_width = bbox[2] - bbox[0]
    text_height = bbox[3] - bbox[1]
    
    # 计算修正后的坐标（补偿字体基线偏移）
    x = 10 - bbox[0]  # 左对齐补偿
    y = 10 - bbox[1]  # 上对齐补偿
    
    # 绘制半透明白字（RGBA模式需要转换，但此处使用RGB直接叠加）
    draw.text((x, y), 
             text, 
             font=font, 
             fill=(255, 255, 255, int(255 * opacity)))  # 透明度仅对支持Alpha的格式有效
    
    # 保存为PNG（保留透明度）或JPEG（无透明度）
    if output_path.lower().endswith(".png"):
        image = image.convert("RGBA")  # 转换为RGBA以支持透明度
        data = image.getdata()
        new_data = []
        for item in data:
            # 将透明度应用到文字区域（非纯黑区域）
            if item[:3] != (0, 0, 0):
                new_data.append((255, 255, 255, int(255 * opacity)))
            else:
                new_data.append((0, 0, 0, 255))
        image.putdata(new_data)
        image.save(output_path, "PNG")
    else:
        image.save(output_path)

# 使用示例
if __name__ == "__main__":
    create_text_watermark(
        text="LXRLXR",
        font_size=30,
        opacity=0.6,
        font_path=None,  # 可选
        output_path="custom_watermark.png"
    )